package com.shujia.jichu

import scala.io.{BufferedSource, Source}


/**
 * 隐式转换：动态地可以让对象增加方法
 *
 * 1、隐式转换方法
 * 2、隐式转换类
 * 3、隐式转换变量
 */
object Demo24Implicit {
  def main(args: Array[String]): Unit = {
    //显式类型转换
//    val s1: String = "100"
//    val i1: Int = s1.toInt
//    println(i1)

    def fun(i: Int): Unit = {
      println(i + 100)
    }

//    fun(200)
    //显式的类型转换
//    fun("200".toInt)
    /**
     * 定义一个隐式转换方法：可以将参数类型转换成返回值类型
     *
     * 注：
     *  1、scala编译器，在编译代码的时候，会识别到需要将A类型转B类型，然后就去找参数是A类型，返回值是B类型的隐式转换函数，自动调用，否则找不到报错
     *  2、只针对参数类型和返回值类型，和隐式函数叫什么无关
     *  3、同一种参数和返回值类型组合的隐式转换函数，同一作用域下只能出现一种
     */
    implicit def strToInt(s:String): Int = {
      Integer.parseInt(s)
    }

    implicit def doubleToInt(d:Double): Int = {
      d.toInt
    }

    fun("200") //等同于下面的
    fun(strToInt("200"))

    fun(3.14)

    /**
     * 隐式转换函数的应用
     */
    import com.shujia.jichu.Test1._

//    val stuPath:String = "scala/data/students.csv"
//    val stuList1: List[String] = Test1.read(stuPath).getLines().toList
//    stuList1.foreach(println)

    val stuList2: List[String] = "scala/data/students.csv".getLines().toList
//    val stuList2: List[String] = read("scala/data/students.csv").getLines().toList
    stuList2.foreach(println)



  }
}

object Test1{
   implicit def read(path: String): BufferedSource = {
    Source.fromFile(path)
  }
}
